#include "stm32f4xx.h"                  // Device header
#include "stm32f4xx_conf.h"
#include "MySPI.h"

/*
 *SPI模式选择:
 *
*CPOL(时钟极性):
 *		0-空闲状态时,SCK=0
 *		1-空闲状态时,SCK=1
 *CPHA(时钟相位):
 *		0-SCK第一个边沿移入数据,第二个边沿移出数据
 *		1-SCK第一个边沿移出数据,第二个边沿移入数据
 *
 *模式0:CPOL=0,CPHA=0
 *模式1:CPOL=0,CPHA=1
 *模式2:CPOL=1,CPHA=0
 *模式3:CPOL=1,CPHA=1
 */

#define MySPI_W_SS(x)		GPIO_WriteBit(MySPI_InitStructure->MySPI_SS_GPIOx,MySPI_InitStructure->MySPI_SS_Pin,(BitAction)(x))//写SS引脚
#define MySPI_W_SCK(x)		GPIO_WriteBit(MySPI_InitStructure->MySPI_SCK_GPIOx,MySPI_InitStructure->MySPI_SCK_Pin,(BitAction)(x))//写SCK引脚
#define MySPI_W_MOSI(x)		GPIO_WriteBit(MySPI_InitStructure->MySPI_MOSI_GPIOx,MySPI_InitStructure->MySPI_MOSI_Pin,(BitAction)(x))//写MOSI引脚
#define MySPI_R_MISO()		GPIO_ReadInputDataBit(MySPI_InitStructure->MySPI_MISO_GPIOx,MySPI_InitStructure->MySPI_MISO_Pin)//读MISO引脚

#define MySPI_SendDelay		150//连续发送两个字节时中间的延时,单位us,范围:0~4294967295

/*
 *函数简介:软件SPI专用延时
 *参数说明:无
 *返回类型:无
 *备注:延时时长由上方宏定义MySPI_SendDelay决定
 *备注:用于连续发送时两个字节之间的延时
 */
void SPI_Delay_us(void)
{		
	uint32_t temp;	    	 
	SysTick->LOAD=MySPI_SendDelay*21; 			//时间加载，我们要延时n倍的us, 1us是一个fac_ua周期，所以总共要延时的周期值为二者相乘最后送到Load中。		 
	SysTick->VAL=0x00;        					//清空计数器
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;	//开启使能位 开始倒数
	do temp=SysTick->CTRL;
	while((temp&0x01) && !(temp&(1<<16)));		//用来判断 systick 定时器是否还处于开启状态，然后在等待时间到达，也就是数到0的时候,此时第十六位设置为1
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//关闭计数器使能位
	SysTick->VAL=0x00;       					//清空计数器
}

/*
 *函数简介:软件SPI初始化
 *参数说明:软件SPI配置结构体
 *返回类型:无
 *备注:使用前需要先定义结构体,所有的引脚、时钟和SPI模式都在结构体里面配置
 */
void MySPI_Init(MySPI_InitTypedef *MySPI_InitStructure)
{
	RCC_AHB1PeriphClockCmd(MySPI_InitStructure->MySPI_SCK_RCC,ENABLE);
	RCC_AHB1PeriphClockCmd(MySPI_InitStructure->MySPI_MOSI_RCC,ENABLE);
	RCC_AHB1PeriphClockCmd(MySPI_InitStructure->MySPI_MISO_RCC,ENABLE);
	RCC_AHB1PeriphClockCmd(MySPI_InitStructure->MySPI_SS_RCC,ENABLE);//开启时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//默认上拉
	GPIO_InitStructure.GPIO_Pin=MySPI_InitStructure->MySPI_SCK_Pin;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(MySPI_InitStructure->MySPI_SCK_GPIOx,&GPIO_InitStructure);//配置SCK
	GPIO_InitStructure.GPIO_Pin=MySPI_InitStructure->MySPI_MOSI_Pin;
	GPIO_Init(MySPI_InitStructure->MySPI_MOSI_GPIOx,&GPIO_InitStructure);//配置MOSI
	GPIO_InitStructure.GPIO_Pin=MySPI_InitStructure->MySPI_SS_Pin;
	GPIO_Init(MySPI_InitStructure->MySPI_SS_GPIOx,&GPIO_InitStructure);//配置SS
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//上拉输入
	GPIO_InitStructure.GPIO_Pin=MySPI_InitStructure->MySPI_MISO_Pin;
	GPIO_Init(MySPI_InitStructure->MySPI_MISO_GPIOx,&GPIO_InitStructure);//配置MISO
	
	MySPI_W_SS(1);//复位SS
	
	if(MySPI_InitStructure->MySPI_Mode==0 || MySPI_InitStructure->MySPI_Mode==1)//复位SCK
		MySPI_W_SCK(0);//CPOL=0
	else if(MySPI_InitStructure->MySPI_Mode==2 || MySPI_InitStructure->MySPI_Mode==3)
		MySPI_W_SCK(1);//CPOL=1
}

/*
 *函数简介:软件SPI数据交换开始
 *参数说明:软件SPI配置结构体
 *返回类型:无
 *备注:即拉低SS完成片选
 *备注:多个片选需要复制多个函数分别控制
 */
void MySPI_Start(MySPI_InitTypedef *MySPI_InitStructure)
{
	MySPI_W_SS(0);
}

/*
 *函数简介:软件SPI数据交换结束
 *参数说明:软件SPI配置结构体
 *返回类型:无
 *备注:即拉高SS结束片选
 *备注:多个片选需要复制多个函数分别控制
 */
void MySPI_Stop(MySPI_InitTypedef *MySPI_InitStructure)
{
	MySPI_W_SS(1);
}

/*
 *函数简介:软件SPI交换一次数据
 *参数说明:软件SPI配置结构体
 *参数说明:8bits发送数据
 *返回类型:8bits接收数据
 *备注:此处发送和接收数据采用同一变量储存
 */
uint8_t MySPI_Swap8bits(MySPI_InitTypedef *MySPI_InitStructure,uint8_t DRByte)
{
	if(MySPI_InitStructure->MySPI_Mode==0)//CPOL=0,CPHA=0
	{
		for(uint8_t i=0;i<8;i++)
		{
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第一个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
			MySPI_W_SCK(0);//第二个边沿
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==1)//CPOL=0,CPHA=1
	{
		for(uint8_t i=0;i<8;i++)
		{
			MySPI_W_SCK(1);//第一个边沿
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第二个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==2)//CPOL=1,CPHA=0
	{
		for(uint8_t i=0;i<8;i++)
		{
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第一个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
			MySPI_W_SCK(1);//第二个边沿
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==3)//CPOL=1,CPHA=1
	{
		for(uint8_t i=0;i<8;i++)
		{
			MySPI_W_SCK(0);//第一个边沿
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第二个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
		}
	}
		
	return DRByte;
}

/*
 *函数简介:软件SPI交换一次数据
 *参数说明:软件SPI配置结构体
 *参数说明:8bits地址
 *参数说明:8bits发送数据
 *返回类型:8bits接收数据
 *备注:此处发送和接收数据采用同一变量储存
 *备注:SPI速度足够快,在发送地址时两个边沿之间不需要加入延时
 *备注:在连续发送两个字节之间需要一定的延时,具体时长需要修改上方宏定义MySPI_SendDelay
 *备注:多个片选需要复制多个函数分别控制
 */
uint8_t MySPI_SwapByte(MySPI_InitTypedef *MySPI_InitStructure,uint8_t Address,uint8_t DRByte)
{
	MySPI_Start(MySPI_InitStructure);//开始
	
	if(MySPI_InitStructure->MySPI_Mode==0)//CPOL=0,CPHA=0
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第一个边沿
			MySPI_W_SCK(0);//第二个边沿
		}
		SPI_Delay_us();
		for(uint8_t i=0;i<8;i++)//交换数据
		{
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第一个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
			MySPI_W_SCK(0);//第二个边沿
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==1)//CPOL=0,CPHA=1
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_SCK(1);//第一个边沿
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第二个边沿
		}
		SPI_Delay_us();
		for(uint8_t i=0;i<8;i++)//交换数据
		{
			MySPI_W_SCK(1);//第一个边沿
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第二个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==2)//CPOL=1,CPHA=0
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第一个边沿
			MySPI_W_SCK(1);//第二个边沿
		}
		SPI_Delay_us();
		for(uint8_t i=0;i<8;i++)//交换数据
		{
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第一个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
			MySPI_W_SCK(1);//第二个边沿
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==3)//CPOL=1,CPHA=1
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_SCK(0);//第一个边沿
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第二个边沿
		}
		SPI_Delay_us();
		for(uint8_t i=0;i<8;i++)//交换数据
		{
			MySPI_W_SCK(0);//第一个边沿
			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第二个边沿
			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
		}
	}
		
	MySPI_Stop(MySPI_InitStructure);//结束
		
	return DRByte;
}

/*
 *函数简介:软件SPI交换一次数据
 *参数说明:软件SPI配置结构体
 *参数说明:8bits地址
 *参数说明:发送数据数组
 *参数说明:发送数据数组的长度
 *参数说明:接收数据数组
 *返回类型:无
 *备注:SPI速度足够快,在发送地址时两个边沿之间不需要加入延时
 *备注:在连续发送两个字节之间需要一定的延时,具体时长需要修改上方宏定义MySPI_SendDelay
 *备注:发送数据数组和接收数据数组长度最好一致
 *备注:多个片选需要复制多个函数分别控制
 */
void MySPI_SwapData(MySPI_InitTypedef *MySPI_InitStructure,uint8_t Address,uint8_t *SendData,uint16_t Length,uint8_t *ReceiveData)
{
	MySPI_Start(MySPI_InitStructure);//开始
	
	if(MySPI_InitStructure->MySPI_Mode==0)//CPOL=0,CPHA=0
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第一个边沿
			MySPI_W_SCK(0);//第二个边沿
		}
		SPI_Delay_us();
		for(uint16_t i=0;i<Length;i++)//交换数据数组
		{
			uint8_t DRByte=SendData[i];
			for(uint8_t j=0;j<8;j++)//交换数据
			{
				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
				MySPI_W_SCK(1);//第一个边沿
				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
				MySPI_W_SCK(0);//第二个边沿
			}
			ReceiveData[i]=DRByte;
			SPI_Delay_us();
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==1)//CPOL=0,CPHA=1
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_SCK(1);//第一个边沿
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第二个边沿
		}
		SPI_Delay_us();
		for(uint16_t i=0;i<Length;i++)//交换数据数组
		{
			uint8_t DRByte=SendData[i];
			for(uint8_t j=0;j<8;j++)//交换数据
			{
				MySPI_W_SCK(1);//第一个边沿
				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
				MySPI_W_SCK(0);//第二个边沿
				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
			}
			ReceiveData[i]=DRByte;
			SPI_Delay_us();
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==2)//CPOL=1,CPHA=0
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(0);//第一个边沿
			MySPI_W_SCK(1);//第二个边沿
		}
		SPI_Delay_us();
		for(uint16_t i=0;i<Length;i++)//交换数据数组
		{
			uint8_t DRByte=SendData[i];
			for(uint8_t j=0;j<8;j++)//交换数据
			{
				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
				MySPI_W_SCK(0);//第一个边沿
				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
				MySPI_W_SCK(1);//第二个边沿
			}
			ReceiveData[i]=DRByte;
			SPI_Delay_us();
		}
	}
	else if(MySPI_InitStructure->MySPI_Mode==3)//CPOL=1,CPHA=1
	{
		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
		{
			MySPI_W_SCK(0);//第一个边沿
			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
			MySPI_W_SCK(1);//第二个边沿
		}
		SPI_Delay_us();
		for(uint16_t i=0;i<Length;i++)//交换数据数组
		{
			uint8_t DRByte=SendData[i];
			for(uint8_t j=0;j<8;j++)//交换数据
			{
				MySPI_W_SCK(0);//第一个边沿
				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
				MySPI_W_SCK(1);//第二个边沿
				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
			}
			ReceiveData[i]=DRByte;
			SPI_Delay_us();
		}
	}
		
	MySPI_Stop(MySPI_InitStructure);
}



/*旧的MySPI.c,只能用于可配置引脚*/
///*
// *SPI模式选择:
// *
//*CPOL(时钟极性):
// *		0-空闲状态时,SCK=0
// *		1-空闲状态时,SCK=1
// *CPHA(时钟相位):
// *		0-SCK第一个边沿移入数据,第二个边沿移出数据
// *		1-SCK第一个边沿移出数据,第二个边沿移入数据
// */
//#define MySPI_Mode_0		0//模式0:CPOL=0,CPHA=0
////#define MySPI_Mode_1		0//模式1:CPOL=0,CPHA=1
////#define MySPI_Mode_2		0//模式2:CPOL=1,CPHA=0
////#define MySPI_Mode_3		0//模式3:CPOL=1,CPHA=1

//#define MySPI_W_SS(x)		GPIO_WriteBit(GPIOB,GPIO_Pin_12,(BitAction)(x))//写SS引脚
//#define MySPI_W_SCK(x)		GPIO_WriteBit(GPIOB,GPIO_Pin_13,(BitAction)(x))//写SCK引脚
//#define MySPI_W_MOSI(x)		GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)(x))//写MOSI引脚
//#define MySPI_R_MISO()		GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)//读MISO引脚

///*
// *函数简介:软件SPI初始化
// *参数说明:无
// *返回类型:无
// *备注:默认SS为SPI2_CS(PB12),SCK为SPI2_CLK(PB13),MOSI为SPI2_MOSI(PB15),MISO为SPI2_MISO(PB14)
// *备注:若修改引脚,除了修改上方宏定义,此函数GPIO初始化也要修改
// */
//void MySPI_Init(void)
//{
//	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//开启时钟
//	
//	GPIO_InitTypeDef GPIO_InitStructure;
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
//	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
//	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//默认上拉
//	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
//	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
//	GPIO_Init(GPIOB,&GPIO_InitStructure);//配置SS、SCK和MOSI
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//上拉输入
//	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
//	GPIO_Init(GPIOB,&GPIO_InitStructure);//配置MISO
//	
//	MySPI_W_SS(1);//复位SS
//	
//	#if defined(MySPI_Mode_0) || defined(MySPI_Mode_1)
//		MySPI_W_SCK(0);//CPOL=0
//	#endif
//	#if defined(MySPI_Mode_2) || defined(MySPI_Mode_3)
//		MySPI_W_SCK(1);//CPOL=1
//	#endif //复位SCK
//}

///*
// *函数简介:软件SPI数据交换开始
// *参数说明:无
// *返回类型:无
// *备注:即拉低SS完成片选
// */
//void MySPI_Start(void)
//{
//	MySPI_W_SS(0);
//}

///*
// *函数简介:软件SPI数据交换结束
// *参数说明:无
// *返回类型:无
// *备注:即拉高SS结束片选
// */
//void MySPI_Stop(void)
//{
//	MySPI_W_SS(1);
//}

///*
// *函数简介:软件SPI交换一次数据
// *参数说明:8bits发送数据
// *返回类型:8bits接收数据
// *备注:此处发送和接收数据采用同一变量储存
// */
//uint8_t MySPI_Swap8bits(uint8_t DRByte)
//{
//	#ifdef MySPI_Mode_0//CPOL=0,CPHA=0
//		for(uint8_t i=0;i<8;i++)
//		{
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第一个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//			MySPI_W_SCK(0);//第二个边沿
//		}
//	#endif
//	#ifdef MySPI_Mode_1//CPOL=0,CPHA=1
//		for(uint8_t i=0;i<8;i++)
//		{
//			MySPI_W_SCK(1);//第一个边沿
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第二个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//		}
//	#endif
//	#ifdef MySPI_Mode_2//CPOL=1,CPHA=0
//		for(uint8_t i=0;i<8;i++)
//		{
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第一个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//			MySPI_W_SCK(1);//第二个边沿
//		}
//	#endif
//	#ifdef MySPI_Mode_3//CPOL=1,CPHA=1
//		for(uint8_t i=0;i<8;i++)
//		{
//			MySPI_W_SCK(0);//第一个边沿
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第二个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//		}
//	#endif
//		
//	return DRByte;
//}

///*
// *函数简介:软件SPI交换一次数据
// *参数说明:8bits地址
// *参数说明:8bits发送数据
// *返回类型:8bits接收数据
// *备注:此处发送和接收数据采用同一变量储存
// *备注:SPI速度足够快,在发送地址时两个边沿之间不需要加入延时
// */
//uint8_t MySPI_SwapByte(uint8_t Address,uint8_t DRByte)
//{
//	MySPI_Start();//开始
//	
//	#ifdef MySPI_Mode_0//CPOL=0,CPHA=0
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第一个边沿
//			MySPI_W_SCK(0);//第二个边沿
//		}
//		
//		for(uint8_t i=0;i<8;i++)//交换数据
//		{
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第一个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//			MySPI_W_SCK(0);//第二个边沿
//		}
//	#endif
//	#ifdef MySPI_Mode_1//CPOL=0,CPHA=1
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_SCK(1);//第一个边沿
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第二个边沿
//		}
//		
//		for(uint8_t i=0;i<8;i++)//交换数据
//		{
//			MySPI_W_SCK(1);//第一个边沿
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第二个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//		}
//	#endif
//	#ifdef MySPI_Mode_2//CPOL=1,CPHA=0
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第一个边沿
//			MySPI_W_SCK(1);//第二个边沿
//		}
//		
//		for(uint8_t i=0;i<8;i++)//交换数据
//		{
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第一个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//			MySPI_W_SCK(1);//第二个边沿
//		}
//	#endif
//	#ifdef MySPI_Mode_3//CPOL=1,CPHA=1
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_SCK(0);//第一个边沿
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第二个边沿
//		}
//		
//		for(uint8_t i=0;i<8;i++)//交换数据
//		{
//			MySPI_W_SCK(0);//第一个边沿
//			MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第二个边沿
//			if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//		}
//	#endif
//		
//	MySPI_Stop();//结束
//		
//	return DRByte;
//}

///*
// *函数简介:软件SPI交换一次数据
// *参数说明:8bits地址
// *参数说明:发送数据数组
// *参数说明:发送数据数组的长度
// *参数说明:接收数据数组
// *返回类型:无
// *备注:SPI速度足够快,在发送地址时两个边沿之间不需要加入延时
// *备注:发送数据数组和接收数据数组长度最好一致
// */
//void MySPI_SwapData(uint8_t Address,uint8_t *SendData,uint16_t Length,uint8_t *ReceiveData)
//{
//	MySPI_Start();//开始
//	
//	#ifdef MySPI_Mode_0//CPOL=0,CPHA=0
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第一个边沿
//			MySPI_W_SCK(0);//第二个边沿
//		}
//		
//		for(uint16_t i=0;i<Length;i++)//交换数据数组
//		{
//			uint8_t DRByte=SendData[i];
//			for(uint8_t j=0;j<8;j++)//交换数据
//			{
//				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//				MySPI_W_SCK(1);//第一个边沿
//				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//				MySPI_W_SCK(0);//第二个边沿
//			}
//			ReceiveData[i]=DRByte;
//		}
//	#endif
//	#ifdef MySPI_Mode_1//CPOL=0,CPHA=1
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_SCK(1);//第一个边沿
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第二个边沿
//		}
//		
//		for(uint16_t i=0;i<Length;i++)//交换数据数组
//		{
//			uint8_t DRByte=SendData[i];
//			for(uint8_t j=0;j<8;j++)//交换数据
//			{
//				MySPI_W_SCK(1);//第一个边沿
//				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//				MySPI_W_SCK(0);//第二个边沿
//				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//			}
//			ReceiveData[i]=DRByte;
//		}
//	#endif
//	#ifdef MySPI_Mode_2//CPOL=1,CPHA=0
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(0);//第一个边沿
//			MySPI_W_SCK(1);//第二个边沿
//		}
//		
//		for(uint16_t i=0;i<Length;i++)//交换数据数组
//		{
//			uint8_t DRByte=SendData[i];
//			for(uint8_t j=0;j<8;j++)//交换数据
//			{
//				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//				MySPI_W_SCK(0);//第一个边沿
//				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//				MySPI_W_SCK(1);//第二个边沿
//			}
//			ReceiveData[i]=DRByte;
//		}
//	#endif
//	#ifdef MySPI_Mode_3//CPOL=1,CPHA=1
//		for(uint8_t i=0;i<8;i++)//发送地址,不接收数据
//		{
//			MySPI_W_SCK(0);//第一个边沿
//			MySPI_W_MOSI(Address & 0x80);Address<<=1;//移出数据(高位先行)
//			MySPI_W_SCK(1);//第二个边沿
//		}
//		
//		for(uint16_t i=0;i<Length;i++)//交换数据数组
//		{
//			uint8_t DRByte=SendData[i];
//			for(uint8_t j=0;j<8;j++)//交换数据
//			{
//				MySPI_W_SCK(0);//第一个边沿
//				MySPI_W_MOSI(DRByte & 0x80);DRByte<<=1;//移出数据(高位先行)
//				MySPI_W_SCK(1);//第二个边沿
//				if(MySPI_R_MISO()==1)DRByte |= 0x01;//移入数据
//			}
//			ReceiveData[i]=DRByte;
//		}
//	#endif
//		
//	MySPI_Stop();
//}
